package com.bangdao.queue;

/**
 * @author chen
 * @create 2021-01-06
 */

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 1. BlockingQueue：由数组结构组成的有界阻塞队列。
 * 2. LinkedBlockingQueue：由链表结构组成的有界（但大小默认值为integer.MAX_VALUE）阻塞队列。
 * 3. PriorityBlockingQueue：支持优先级排序的无界阻塞队列。
 * 4. DelayQueue：使用优先级队列实现的延迟无界阻塞队列。
 * 5. SynchronousQueue：不存储元素的阻塞队列，也即单个元素的队列。
 * 6. LinkedTransferQueue：由链表组成的无界阻塞队列。
 * 7. LinkedBlockingDeque：由链表组成的双向阻塞队列。
 * <p>
 * **抛出异常**
 * <p>
 * add正常执行返回true，element（不删除）和remove返回阻塞队列中的第一个元素
 * 当阻塞队列满时，再往队列里add插入元素会抛IllegalStateException:Queue full
 * 当阻塞队列空时，再往队列里remove移除元素会抛NoSuchElementException
 * 当阻塞队列空时，再调用element检查元素会抛出NoSuchElementException
 * <p>
 * **特定值**
 * 插入方法，成功ture失败false
 * 移除方法，成功返回出队列的元素，队列里没有就返回null
 * 检查方法，成功返回队列中的元素，没有返回null
 * <p>
 * **一直阻塞**
 * <p>
 * 如果试图的操作无法立即执行，该方法调用将会发生阻塞，直到能够执行。
 * 当阻塞队列满时，再往队列里put元素，队列会一直阻塞生产者线程直到put数据or响应中断退出
 * 当阻塞队列空时，再从队列里take元素，队列会一直阻塞消费者线程直到队列可用
 * <p>
 * **超时退出**
 * <p>
 * 如果试图的操作无法立即执行，该方法调用将会发生阻塞，直到能够执行，但等待时间不会超过给定值。
 * 返回一个特定值以告知该操作是否成功(典型的是 true / false)。
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
        // 第一组方法：add remove element
//        System.out.println(queue.add("a"));
//        System.out.println(queue.add("b"));
//        System.out.println(queue.add("c"));
//        System.out.println(queue.add("d"));
//        System.out.println(queue.element());
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
        //System.out.println(queue.element());
        // 第二组：offer poll peek
//        System.out.println(queue.offer("a"));
//        System.out.println(queue.offer("b"));
//        System.out.println(queue.offer("c"));
//        System.out.println(queue.offer("d"));
//        System.out.println(queue.peek());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.peek());
        // 第三组：put take
//        queue.put("a");
//        queue.put("b");
//        queue.put("c");
//        System.out.println(queue.take());
//        queue.put("d");
//        System.out.println(queue.take());
//        System.out.println(queue.take());
//        System.out.println(queue.take());
        // 第四组：offer poll
        System.out.println(queue.offer("a"));
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        System.out.println(queue.offer("d", 5, TimeUnit.SECONDS));
    }
}
